﻿Imports System.Collections.ObjectModel
Imports System.Data
Imports System.IO
Imports System.Text
Imports System.Threading

Class CMTraspasos
    Dim obsTraspasos As New ObservableCollection(Of CTraspaso)
    Dim dtDirecto As New DataTable()
    Dim dtParametros As New DataTable()
    Private traspasoEnEdicion As CTraspaso
    Private TraspasoServicio As New CTraspasosServicio()
    Private servGrales As New CServiciosGenerales()

#Region "Carga página"
    Private Sub CMTraspasos_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
        Try
            dtDirecto.Columns.Add("ENTITE")
            dtDirecto.Columns.Add("PF_COD")
            dtDirecto.Columns.Add("INST_ACR")
            dtDirecto.Columns.Add("XACT_TYP")
            dtDirecto.Columns.Add("INST_QTY")
            dtDirecto.Columns.Add("INST_PRICE")
            dtDirecto.Columns.Add("XACT_DAT")
            dtDirecto.Columns.Add("SETTLE_DAT")
            dtDirecto.Columns.Add("BROKER_COD")
            dtDirecto.Columns.Add("COMMENT")
            dtDirecto.Columns.Add("AMT_BROKER")
            dtDirecto.Columns.Add("AMT_VAT")

            grdTraspasos.ItemsSource = obsTraspasos

            CargaParametrosTraspasos()

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Carga página traspasos", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub CargaParametrosTraspasos()
        dtParametros = TraspasoServicio.ObtieneParametrosTraspasos()
    End Sub
#End Region

#Region "Traspasos"
    Private Sub grdTraspasos_MouseRightButtonUp(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdTraspasos.MouseRightButtonUp
        Dim objDepend As DependencyObject = e.OriginalSource
        Dim celda As DataGridCell = Nothing

        Me.grdTraspasos.ContextMenu = Nothing
        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend
                If celda.IsSelected = False Then
                    Me.grdTraspasos.UnselectAllCells()
                    celda.IsSelected = True
                End If

                celda.Focus()
                Me.grdTraspasos.ContextMenu = AgregarMenuContextual(0)

                Exit While
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Function AgregarMenuContextual(ByVal opcion As Integer) As ContextMenu
        Dim miMenuContextual As New ContextMenu
        Dim mnuCopia As New System.Windows.Controls.MenuItem
        Dim mnuPegar As New System.Windows.Controls.MenuItem

        mnuCopia.Header = "Copiar"
        miMenuContextual.Items.Add(mnuCopia)
        AddHandler mnuCopia.Click, AddressOf mnuCopiar_click

        'Este case esta preparado para extender la funcionalidad de las opciones del menú contextual
        Select Case opcion
            Case 0
                mnuPegar.Header = "Pegar"
                miMenuContextual.Items.Add(mnuPegar)
                AddHandler mnuPegar.Click, AddressOf mnuPegar_click
        End Select

        Return miMenuContextual
    End Function

    Private Sub mnuPegar_click(sender As Object, e As RoutedEventArgs)
        Try
            pegarDatos(Me.grdTraspasos)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End Try
    End Sub

    Private Sub mnuCopiar_click(sender As Object, e As RoutedEventArgs)
        Try
            If copiarCeldas(Me.grdTraspasos) = False Then
                MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. Error al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnAgregarTraspaso_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnAgregarTraspaso.Click
        Dim traspasoNuevo As CTraspaso = New CTraspaso(0, "0000000", 0, "Instrumento", "Serie", 0)
        Dim lstTraspaso As New ObservableCollection(Of CTraspaso)

        grdTraspasos.UnselectAllCells()
        grdTraspasos.UpdateLayout()

        lstTraspaso = grdTraspasos.ItemsSource
        lstTraspaso.Add(traspasoNuevo)

        grdTraspasos.ScrollIntoView(grdTraspasos.Items(grdTraspasos.Items.Count - 1))
        grdTraspasos.UpdateLayout()

        Dim celda As DataGridCell = ObtenerCelda(grdTraspasos, grdTraspasos.Items.Count - 1, 0)
        If Not celda Is Nothing Then
            celda.Focus()
            grdTraspasos.BeginEdit()
            celda.IsSelected = True
        End If
    End Sub

    Private Sub btnEliminarTraspaso_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnEliminaTraspaso.Click
        Dim traspasos As ObservableCollection(Of CTraspaso) = grdTraspasos.ItemsSource
        Dim traspasoEliminar As New ObservableCollection(Of CTraspaso)
        Dim traspasoAgregado As New CTraspaso()
        Dim traspasoRecorrido As New CTraspaso()

        If grdTraspasos.SelectedCells.Count > 0 Then
            For Each celda As DataGridCellInfo In grdTraspasos.SelectedCells
                traspasoEliminar.Add(CType(celda.Item, CTraspaso))
            Next

            For Each T As CTraspaso In traspasoEliminar
                traspasos.Remove(T)
            Next

            grdTraspasos.UpdateLayout()
        Else
            Dim msgBorrado As MessageBoxResult

            msgBorrado = MessageBox.Show("¿Desea borrar todos los registros no utilizados?", "Borrado traspasos", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If (msgBorrado = MessageBoxResult.Yes) Then
                For Each ctAux As CTraspaso In traspasos
                    If ctAux.Origen = 0 And ctAux.Destino = 0 And ctAux.TV = "0" And ctAux.Instrumento = "Instrumento" And ctAux.Serie = "Serie" And ctAux.Titulos = 0 Then
                        traspasoEliminar.Add(ctAux)
                    End If
                Next

                For Each T As CTraspaso In traspasoEliminar
                    traspasos.Remove(T)
                Next

                grdTraspasos.UpdateLayout()
                grdTraspasos.Items.Refresh()
            End If
        End If

    End Sub

    Private Function ObtenerCelda(ByRef miDataGrid As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As DataGridCell
        Try
            Dim row As DataGridRow = miDataGrid.ItemContainerGenerator.ContainerFromIndex(indexRow)
            Dim cellContent As Object = miDataGrid.Columns(indexCol).GetCellContent(row)

            Dim objDepend As DependencyObject = cellContent
            Dim celda As DataGridCell = Nothing

            While Not objDepend Is Nothing

                If objDepend.GetType().Name = "DataGridCell" Then
                    celda = objDepend
                    Return celda
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While
        Catch ex As Exception
            Throw ex
        End Try

        Return Nothing
    End Function

    Private Sub grdTraspasos_BeginningEdit(sender As System.Object, e As System.Windows.Controls.DataGridBeginningEditEventArgs) Handles grdTraspasos.BeginningEdit
        traspasoEnEdicion = grdTraspasos.CurrentItem
    End Sub

    Private Sub grdTraspasos_CellEditEnding(sender As System.Object, e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdTraspasos.CellEditEnding
        Dim traspasoCambio As CTraspaso = New CTraspaso()
        Dim traspasoActual As CTraspaso
        Dim traspasos As ObservableCollection(Of CTraspaso) = grdTraspasos.ItemsSource

        Select Case e.EditAction
            Case DataGridEditAction.Cancel
                traspasoCambio = TryCast(grdTraspasos.Items(grdTraspasos.Items.Count - 1), CTraspaso)

                If traspasoCambio.EsEditableNuevo Then
                    traspasos.Remove(traspasoCambio)
                    grdTraspasos.UpdateLayout()
                End If
            Case DataGridEditAction.Commit
                If Not sender.CurrentItem Is Nothing Then
                    Dim txtContenidoCelda As Object = sender.Columns(e.Column.DisplayIndex).GetCellContent(sender.CurrentItem)
                    Dim Columna As Integer = e.Column.DisplayIndex
                    traspasoActual = TryCast(grdTraspasos.CurrentCell.Item, CTraspaso)

                    'If traspasoActual.Equals(traspasoEnEdicion) = False Then
                    '    CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                    'End If

                    traspasoActual.EsEditableNuevo = False

                    If Columna = 0 Or Columna = 1 Or Columna = 5 Then
                        Try
                            Dim intDato As Integer = Convert.ToInt64(txtContenidoCelda.Text)
                        Catch ex As Exception
                            CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                        End Try
                    End If
                End If
        End Select

        traspasoEnEdicion = Nothing
    End Sub

    Private Sub grdTraspasos_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles grdTraspasos.PreviewKeyDown
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.C Then
            Try
                If copiarCeldas(Me.grdTraspasos) = False Then
                    MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. Error al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.V Then
            Try
                Dim col As Integer = Me.grdTraspasos.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdTraspasos.Items.IndexOf(CType(Me.grdTraspasos.CurrentCell.Item, CTraspaso))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdTraspasos, row, col)

                Me.grdTraspasos.CancelEdit()
                pegarDatos(Me.grdTraspasos)

            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Error)
                Me.grdTraspasos.CancelEdit(DataGridEditingUnit.Cell)
            End Try
        End If
        If e.Key = Key.Delete Then
            Try
                Dim col As Integer = Me.grdTraspasos.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdTraspasos.Items.IndexOf(CType(Me.grdTraspasos.CurrentCell.Item, CTraspaso))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdTraspasos, row, col)

                If celda.IsEditing = False Then
                    BorraDatosSeleccionados(Me.grdTraspasos)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Borrar contenido de celdas", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
    End Sub

    Private Sub BorraDatosSeleccionados(ByRef gridDeDatos As DataGrid)

        Dim lstInterAux As ObservableCollection(Of CTraspaso)

        lstInterAux = gridDeDatos.ItemsSource

        Try
            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells
                Dim col As Integer = celda.Column.DisplayIndex
                Dim row As Integer = gridDeDatos.Items.IndexOf(CType(celda.Item, CTraspaso))

                Dim rowData As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(row)
                Dim cellContent As TextBlock = gridDeDatos.Columns(col).GetCellContent(rowData)
                cellContent.Text = CTraspaso.ValorInicalColumna(col)

                lstInterAux(row)(col) = CTraspaso.ValorInicalColumna(col)
            Next



        Catch ex As Exception
            Throw ex
        End Try


    End Sub

    Private Function copiarCeldas(ByRef gridDeDatos As DataGrid) As Boolean
        Try
            Dim lstInterAux As ObservableCollection(Of CTraspaso) = gridDeDatos.ItemsSource
            Dim datos As New System.Text.StringBuilder
            Dim copiadoCorrecto As Boolean = True
            Dim colIni As Integer = Integer.MaxValue
            Dim rowIni As Integer = Integer.MaxValue
            Dim colFin As Integer = Integer.MinValue
            Dim rowFin As Integer = Integer.MinValue
            Dim i As Integer = 0
            Dim j As Integer = 0

            Dim columnasIndex(gridDeDatos.SelectedCells.Count - 1) As Integer
            Dim renglonesIndex(gridDeDatos.SelectedCells.Count - 1) As Integer

            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells
                renglonesIndex(i) = gridDeDatos.Items.IndexOf(CType(celda.Item, CTraspaso))
                columnasIndex(j) = celda.Column.DisplayIndex
                i += 1
                j += 1
            Next

            rowIni = renglonesIndex.Min()
            rowFin = renglonesIndex.Max()
            colIni = columnasIndex.Min()
            colFin = columnasIndex.Max()

            For i = rowIni To rowFin
                For j = colIni To colFin
                    If EsSeleccionadaLaCelda(gridDeDatos, i, j) Then
                        datos.Append(lstInterAux(i)(j).ToString() & vbTab)
                    Else
                        copiadoCorrecto = False
                        GoTo fuera
                    End If
                Next
                datos.Remove(datos.Length - 1, 1)
                datos.Append(vbLf)
            Next

            datos.Remove(datos.Length - 1, 1)

fuera:
            If copiadoCorrecto = True Then
                Clipboard.Clear()
                Clipboard.SetText(datos.ToString())
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Function EsSeleccionadaLaCelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As Boolean
        Try
            Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
            Dim cellContent As TextBlock = gridDeDatos.Columns(indexCol).GetCellContent(row)
            Dim objDepend As DependencyObject = cellContent
            Dim celda As DataGridCell = Nothing

            While Not objDepend Is Nothing
                If objDepend.GetType().Name = "DataGridCell" Then
                    celda = objDepend

                    If celda.IsSelected = True Then
                        Return True
                    Else
                        Return False
                    End If
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While

            Return False
        Catch ex As Exception
            Return False
        End Try
    End Function

    Private Sub pegarDatos(ByRef gridDeDatos As DataGrid)
        Dim lstInterAux As ObservableCollection(Of CTraspaso) = gridDeDatos.ItemsSource
        Dim datos As CDatosEnFormatoX

        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)

        '1) Validaciones: obtener información del portapapeles
        If datos.Datos.length = 0 Then
            Exit Sub
        End If

        If datos Is Nothing Then
            MessageBox.Show("No se pudo copiar los datos", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        '2) Validaciones: compatibilidad  
        Dim colTot As Integer = gridDeDatos.Columns.Count
        Dim rowTot As Integer = gridDeDatos.Items.Count

        Dim colActual As Integer = gridDeDatos.SelectedCells.First.Column.DisplayIndex
        Dim rowActual As Integer = gridDeDatos.Items.IndexOf(CType(gridDeDatos.SelectedCells.First.Item, CTraspaso))

        'Validar renglones
        If datos.NumeroRenglones > ((rowTot - (rowActual + 1)) + 1) Then
            MessageBox.Show("No coinciden las dimensiones de datos a pegar (R)", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        If datos.NumeroColumnas.Max > ((colTot - (colActual + 1)) + 1) Then
            MessageBox.Show("No coinciden las dimensiones de datos a pegar (C)", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        '2) Realizar copiado  
        Dim i As Integer = 0
        Dim j As Integer = 0

        Dim coontador As Integer = 0
        Dim limRow As Integer = (rowActual + (datos.NumeroRenglones - 1))

        gridDeDatos.UnselectAllCells()

        Try
            For i = rowActual To limRow
                Dim limCol As Integer = (colActual + (datos.NumeroColumnas(coontador) - 1))

                For j = colActual To limCol
                    If datos.Datos(i - rowActual)(j - colActual) <> vbLf And (Not CType(datos.Datos(i - rowActual)(j - colActual), String).Trim().Equals("")) Then
                        Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(i)
                        Dim cellContent As TextBlock = gridDeDatos.Columns(j).GetCellContent(row)

                        If j = 0 Or j = 1 Or j = 5 Then
                            Dim auxImp As Integer
                            auxImp = CType(datos.Datos(i - rowActual)(j - colActual), Integer)
                        Else
                            Dim auxImpDos As String
                            auxImpDos = CType(datos.Datos(i - rowActual)(j - colActual), String)
                        End If

                        cellContent.Text = datos.Datos(i - rowActual)(j - colActual).ToString.Trim()
                        lstInterAux(i)(j) = datos.Datos(i - rowActual)(j - colActual).ToString.Trim()
                        seleccionarcelda(gridDeDatos, i, j)
                    End If
                Next
                coontador += 1
            Next
        Catch ex As Exception
            gridDeDatos.Items.Refresh()
            Throw New Exception("No se pudo terminar de copiar los datos debido a que no coinciden con el formato especificado para cada celda", ex)
        End Try
    End Sub

    Private Sub seleccionarcelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer)
        Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
        Dim cellContent As TextBlock = gridDeDatos.Columns(indexCol).GetCellContent(row)
        Dim objDepend As DependencyObject = cellContent
        Dim celda As DataGridCell = Nothing

        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend

                If celda.IsSelected = False Then
                    celda.IsSelected = True
                    celda.Focus()
                    Exit While
                End If
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Sub btnInsertar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnInsertar.Click
        Try
            Dim datos As CDatosEnFormatoX

            datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)

            If datos.Datos.length = 0 Then
                Exit Sub
            End If

            If datos Is Nothing Then
                MessageBox.Show("No se pudieron insertar los datos", "Insertado registros", MessageBoxButton.OK, MessageBoxImage.Error)
                grdTraspasos.CancelEdit(DataGridEditingUnit.Cell)
                Exit Sub
            End If

            Dim colTot As Integer = grdTraspasos.Columns.Count

            If datos.NumeroColumnas.Max <> colTot Then
                MessageBox.Show("El número de columnas es incorrecto, favor de revisar la información copiada", "Insertado registros", MessageBoxButton.OK, MessageBoxImage.Error)
                grdTraspasos.CancelEdit(DataGridEditingUnit.Cell)
                Exit Sub
            Else
                Dim lstTraspaso As New ObservableCollection(Of CTraspaso)

                lstTraspaso = grdTraspasos.ItemsSource

                For renglon = 0 To datos.NumeroRenglones - 1 Step 1                    
                    Dim traspasoNuevo As CTraspaso = New CTraspaso()

                    Try
                        traspasoNuevo.Origen = Convert.ToInt64(datos.Datos(renglon)(0).ToString().Trim())
                    Catch ex As Exception
                        traspasoNuevo.Origen = 0
                    End Try

                    Try
                        traspasoNuevo.Destino = Convert.ToInt64(datos.Datos(renglon)(1).ToString().Trim())
                    Catch ex As Exception
                        traspasoNuevo.Destino = 0
                    End Try

                    traspasoNuevo.TV = datos.Datos(renglon)(2).ToString().Trim()

                    traspasoNuevo.Instrumento = datos.Datos(renglon)(3).ToString().Trim()

                    traspasoNuevo.Serie = datos.Datos(renglon)(4).ToString().Trim()

                    Try
                        traspasoNuevo.Titulos = Convert.ToInt64(Convert.ToDouble(datos.Datos(renglon)(5).ToString().Trim()))
                    Catch ex As Exception
                        traspasoNuevo.Titulos = 0
                    End Try

                    lstTraspaso.Add(traspasoNuevo)
                Next
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Inserción masiva de traspasos", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Procesa Datos"
    Private Sub btnProcesaDatos_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnProcesaDatos.Click
        If grdTraspasos.Items.Count > 0 Then
            Try
                Dim traspasos As ObservableCollection(Of CTraspaso) = grdTraspasos.ItemsSource
                Dim intBitacoraProcesaDatos As Integer = CUtileria.GrabarBitacora("Traspasos", "Procesa datos", "Procesamiento de datos ingresados por el usuario")

                dtDirecto.Clear()

                Mouse.OverrideCursor = Cursors.Wait

                For Each tAux As CTraspaso In traspasos

                    If tAux.EsEditableNuevo = False Then
                        Dim drAux As DataRow = dtDirecto.NewRow()
                        Dim drAuxDupl As DataRow = dtDirecto.NewRow()

                        drAux("ENTITE") = "ID_XACT"
                        drAuxDupl("ENTITE") = "ID_XACT"

                        drAux("PF_COD") = tAux.Origen
                        drAuxDupl("PF_COD") = tAux.Destino

                        drAux("INST_ACR") = tAux.TV.ToString + tAux.Instrumento + tAux.Serie
                        drAuxDupl("INST_ACR") = tAux.TV.ToString + tAux.Instrumento + tAux.Serie

                        drAux("XACT_TYP") = dtParametros.Rows(0)(0).ToString
                        drAuxDupl("XACT_TYP") = dtParametros.Rows(2)(0).ToString

                        drAux("INST_QTY") = tAux.Titulos
                        drAuxDupl("INST_QTY") = tAux.Titulos

                        drAux("INST_PRICE") = 0
                        drAuxDupl("INST_PRICE") = 0

                        drAux("XACT_DAT") = Now.Date.ToString("dd-MM-yy")
                        drAuxDupl("XACT_DAT") = Now.Date.ToString("dd-MM-yy")

                        drAux("SETTLE_DAT") = Now.Date.ToString("dd-MM-yy")
                        drAuxDupl("SETTLE_DAT") = Now.Date.ToString("dd-MM-yy")

                        drAux("BROKER_COD") = dtParametros.Rows(1)(0).ToString
                        drAuxDupl("BROKER_COD") = dtParametros.Rows(1)(0).ToString

                        drAux("COMMENT") = "TraspasoHacia " + tAux.Destino.ToString
                        drAuxDupl("COMMENT") = "TraspasoDesde " + tAux.Origen.ToString

                        drAux("AMT_BROKER") = 0
                        drAuxDupl("AMT_BROKER") = 0

                        drAux("AMT_VAT") = 0
                        drAuxDupl("AMT_VAT") = 0

                        dtDirecto.Rows.Add(drAux)
                        dtDirecto.Rows.Add(drAuxDupl)
                        dtDirecto.AcceptChanges()
                    End If
                Next

                tabPrincipal.IsSelected = False
                tabDirecto.IsSelected = True

                grdDirecto.ItemsSource = Nothing
                grdDirecto.Items.Refresh()
                grdDirecto.ItemsSource = dtDirecto.DefaultView
                grdDirecto.Items.Refresh()

                If dtDirecto.Rows.Count > 0 Then
                    btnCargaDecalog.IsEnabled = True
                Else
                    btnCargaDecalog.IsEnabled = False
                End If

                CUtileria.CompletarRegBitacora(intBitacoraProcesaDatos)

                Mouse.OverrideCursor = Cursors.Arrow
            Catch ex As Exception
                Dim intErrorProcesaDatos As Integer = CUtileria.GrabarBitacora("Traspasos", "Procesa datos", ex.Message)
                CUtileria.CompletarRegBitacora(intErrorProcesaDatos)

                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("Error TI500. " & ex.Message, "Procesamiento de datos", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        Else
            MessageBox.Show("No hay traspasos a procesar", "Procesamiento de datos", MessageBoxButton.OK, MessageBoxImage.Information)
        End If
    End Sub
#End Region

#Region "Carga DECALOG"
    Private Sub btnCargaDECALOG_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCargaDecalog.Click
        Dim msgResultado As MessageBoxResult
        Dim strRutaTLOADER As String
        Dim intBitacoraCargaDECALOG As Integer

        strRutaTLOADER = TraspasoServicio.ObtieneRutaTLOADERTraspasos()

        If File.Exists(strRutaTLOADER) Then
            msgResultado = MessageBox.Show("¿Desea procesar los datos en DECALOG?", "Atención", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgResultado = MessageBoxResult.Yes Then
                Mouse.OverrideCursor = Cursors.Wait

                Try
                    Dim strRutaDECALOG As String, strRutaDirectorio As String, strParametrosAux As String, strNombrePrefijo As String
                    Dim indice As Integer = 0, indiceAux As Integer = 2

                    strRutaDECALOG = TraspasoServicio.ObtieneRutaArchivoTraspasos()
                    strParametrosAux = TraspasoServicio.ObtieneParametrosTLOADERCOVAFTLTraspasos()

                    While indice >= 0
                        indice = strRutaDECALOG.IndexOf("\", indiceAux)

                        If indice > 0 Then
                            indiceAux = indice + 1
                        End If
                    End While

                    strRutaDirectorio = strRutaDECALOG.Substring(0, indiceAux - 1)
                    strNombrePrefijo = strRutaDECALOG.Substring(indiceAux, strRutaDECALOG.Length - indiceAux)

                    If Directory.Exists(strRutaDirectorio) Then
                        Try
                            Dim strConstructor As StringBuilder = New StringBuilder()
                            Dim intTotalColumnas As Integer = grdDirecto.Columns.Count

                            intBitacoraCargaDECALOG = CUtileria.GrabarBitacora("Traspasos", "Carga a DECALOG", "Se genera archivo y se carga a DECALOG mediante el TLOADER en " + strRutaDECALOG)

                            For Each dgColumna As DataGridColumn In grdDirecto.Columns
                                If dgColumna.Visibility = System.Windows.Visibility.Visible Then
                                    strConstructor.Append(dgColumna.Header + ",")
                                End If
                            Next

                            strConstructor.Replace(",", vbNewLine, strConstructor.Length - 1, 1)

                            For Each drAux As DataRowView In grdDirecto.Items
                                For Each dgColumna As DataGridColumn In grdDirecto.Columns
                                    If dgColumna.Visibility = System.Windows.Visibility.Visible Then
                                        strConstructor.Append(drAux(dgColumna.Header).ToString.Replace(",", "") + ",")
                                    End If
                                Next

                                strConstructor.Replace(",", vbNewLine, strConstructor.Length - 1, 1)
                            Next

                            Dim strNombreFinalArchivo As String = strRutaDirectorio + "\" + servGrales.ObtenerPREFIJOARCHIVO + strNombrePrefijo + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".csv"

                            Dim swAux As StreamWriter = New StreamWriter(strNombreFinalArchivo)

                            swAux.WriteLine(strConstructor)

                            swAux.Close()

                            strParametrosAux = strParametrosAux.Replace("@Archivo", strNombreFinalArchivo)

                            Dim intInsercionBitacoraDECALOG As Integer = TraspasoServicio.InsertaBitacoraDECALOG(strNombreFinalArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                            If intInsercionBitacoraDECALOG > 0 Then

                                TraspasoServicio.EjecutarProceso(strRutaTLOADER, strParametrosAux)

                                Thread.Sleep(7000)

                                Dim intVerificacionArchivo As Integer = VerificaArchivoDECALOG(strNombreFinalArchivo)

                                CUtileria.CompletarRegBitacora(intBitacoraCargaDECALOG)

                                Mouse.OverrideCursor = Cursors.Arrow

                                If intVerificacionArchivo = 1 Then
                                    TraspasoServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                    Dim strFolios = ActualizaFolioDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                    grdDirecto.ItemsSource = Nothing
                                    grdDirecto.Items.Refresh()
                                    dtDirecto.Clear()

                                    btnCargaDecalog.IsEnabled = False

                                    MessageBox.Show("Los registros fueron procesados en Decalog sin ningun error. Folio(s) generado(s): " & strFolios, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Information)
                                ElseIf intVerificacionArchivo = 2 Then
                                    TraspasoServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                    Thread.Sleep(2000)

                                    ActualizaErrorDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                    MessageBox.Show("Ha ocurrido algún error al procesar los registros, por favor revise el fichero: " + strNombreFinalArchivo + ".tl.err_text", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                                ElseIf intVerificacionArchivo = 0 Then
                                    Mouse.OverrideCursor = Cursors.Arrow

                                    MessageBox.Show("Ha ocurrido un error y no se obtuvo el archivo de confirmación de DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                                ElseIf intVerificacionArchivo = 3 Then
                                    TraspasoServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                    Dim strFolios = ActualizaFolioDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                    Mouse.OverrideCursor = Cursors.Arrow

                                    MessageBox.Show("Archivo parcialmente correcto con los folios: " & strFolios & ". También se encontraron errores o reglas transgedidas, revisar el fichero: " + strNombreFinalArchivo + ".tl.err_text", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Warning)

                                    Thread.Sleep(1000)

                                    ActualizaErrorDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)
                                End If
                            Else
                                Mouse.OverrideCursor = Cursors.Arrow

                                MessageBox.Show("Ocurrió un error al guardar el envío del archivo en la bitácora", "Generación órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
                            End If

                        Catch ex As Exception
                            Dim intErrorCargaArchivoDecalog As Integer = CUtileria.GrabarBitacora("Traspasos", "Carga a DECALOG", ex.Message)
                            CUtileria.CompletarRegBitacora(intErrorCargaArchivoDecalog)

                            Mouse.OverrideCursor = Cursors.Arrow

                            MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                        End Try
                    Else
                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a procesar en DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Catch ex As Exception
                    Dim intErrorDosCargaArchivoDecalog As Integer = CUtileria.GrabarBitacora("Traspasos", "Carga a DECALOG", ex.Message)
                    CUtileria.CompletarRegBitacora(intErrorDosCargaArchivoDecalog)

                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        Else
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Verificar que existe el archivo: " + strRutaTLOADER + " para poder cargar los archivos a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
        End If
    End Sub

    Private Function VerificaArchivoDECALOG(ByVal strArchivo As String) As Integer
        Try
            Dim intSegundos As Integer = TraspasoServicio.ObtieneSegundosEspera()
            Dim intContador As Integer = 1
            Dim strArchivoTextoError As String = strArchivo + ".tl.err_text"
            Dim strArchivoOK As String = strArchivo + ".tl.ok"
            Dim strArchivoTextoOk As String = strArchivo + ".tl.ok_text"
            Dim strArchivoError As String = strArchivo + ".tl.err"

            strArchivo = strArchivo + ".tl.err_text"

            While (intContador <= intSegundos)
                If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOk) And File.Exists(strArchivoError) Then
                    Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                    Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                    Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                    Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOk)

                    If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                        Return 1
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                        Return 3                    
                    End If
                End If

                Thread.Sleep(1000)

                intContador += 1
            End While

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Function ActualizaFolioDECALOG(ByVal strArchivo As String, ByVal intId As Integer) As String
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".tl.ok_text", strFolio As String = String.Empty, strAux As String
            Dim inicioIdx As Integer, finIdx As Integer

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()

                        inicioIdx = strAux.IndexOf("Ok,")
                        finIdx = strAux.IndexOf("]")

                        If inicioIdx > 0 And finIdx > 0 Then
                            strFolio = strFolio + strAux.Substring(inicioIdx + 3, finIdx - (inicioIdx + 3)).Trim() + ","
                        End If

                    End While

                    srArchivoOk.Close()

                    If strFolio.Length > 0 Then
                        strFolio = strFolio.Substring(0, strFolio.Length - 1)
                    End If

                    TraspasoServicio.ActualizaFolioDECALOG(intId, strFolio, CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return strFolio
                Else
                    TraspasoServicio.ActualizaFolioDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return "Archivo sin información"
                End If
            Else
                Return "No se encontró el archivo"
            End If
        Catch ex As Exception
            Dim intErrorFolioDECALOG As Integer = CUtileria.GrabarBitacora("Traspasos", "ActualizarFolioDecalog", "Ocurrió un error al obtener el folio de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorFolioDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Folio Decalog", MessageBoxButton.OK, MessageBoxImage.Error)

            Return ""
        End Try
    End Function

    Private Sub ActualizaErrorDECALOG(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".tl.err_text", strMensaje As String = String.Empty

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    strMensaje = File.ReadAllText(strNombreArchivoFolio)

                    TraspasoServicio.ActualizaMensajeErrorDECALOG(intId, strMensaje, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else
                    TraspasoServicio.ActualizaMensajeErrorDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            Dim intErrorDECALOG As Integer = CUtileria.GrabarBitacora("Traspasos", "ActualizarErrorDecalog", "Ocurrió un error al obtener el mensaje de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Error Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region
End Class
